//
//  LCBaseViewController.swift
//  SwiftWeiBo
//
//  Created by LiCheng on 2017/2/8.
//  Copyright © 2017年 LiCheng. All rights reserved.
//

/**
    作用:
     - 设置导航条
        - 解决 push 隐藏 bar
        - 解决 navBar 返回时的重叠
 
     - 判断用户是否登录
        - 登录: 设置表格视图
                - 设置 数据源/代理
                - 实现空的数据源方法
                - 实现空的加载数据方法
                - 添加 上啦下拉刷新控件
        - 未登录: 设置访客视图
                - 自定义 实例化 视图
                - 设置访客视图信息字典（从 json 中加载）
                - 访客视图内部， 实现 didSet来设置内容（imageName如果== “” 为首页）

     - 所有主控制器的基类
     - 设置界面 
        - 设置新的 导航条 + navItem
        - 重写 title 属性，可以保证外部设置 title 的代码不需要任何的改变
     - 设置表格视图
     - 封装 刷新逻辑 (上啦/下拉)
     - 访客视图 -> 用户没有登录的界面
 */

import UIKit

class LCBaseViewController: UIViewController {

    // MARK: - 属性

    /// 访客视图信息
    var visiorInfoDict: [String: String]?

    /// 列表视图
    var tableView: UITableView?

    /// 刷新控件
    var refreshControl: UIRefreshControl?

    /// 上啦加载标记
    var isPullpo = false

    /// 自定义 导航条
    lazy var navigationBar = UINavigationBar(frame: CGRect(x: 0, y: 0, width: UIScreen.cz_screenWidth(), height: 64))

    /// 自定义 导航条目
    //  - 自定义后， 以后要设置 导航条内容，使用 navItem
    lazy var navItem = UINavigationItem()


    // MARK: - 系统方法
    override func viewDidLoad() {
        super.viewDidLoad()

        setupUI()

        // 用户登录才加载数据 否则不加载
        LCNetworkManager.shared.userLogon ? loadData() : ()

        // 注册通知
        NotificationCenter.default.addObserver(
            self,
            selector: #selector(loginSuccess),
            name: NSNotification.Name(LCUserLoginSuccessNotification),
            object: nil)

    }

    deinit {
        // 注销通知
        NotificationCenter.default.removeObserver(self)
    }


    /// 重写 title 的 didSet 方法
    override var title: String? {
        didSet {
            navItem.title = title
        }
    }


    /// 加载数据方法， 由子类去实现
    func loadData() {

        // 如果子类不实现该方法， 默认 刷新控件关闭
        refreshControl?.endRefreshing()
    }
}

// MARK: - 访客视图按钮监听
extension LCBaseViewController {


    /// 登录成功处理
    @objc fileprivate func loginSuccess(n: Notification) {
        print("登录成功\(n)")

        // 0. 修改导航条, 清除左右按钮
        //    - 在下面调用 loadView 时就会重新设置
        navItem.leftBarButtonItem = nil
        navItem.rightBarButtonItem = nil

        // 1. 设置 tableView 界面
        //    - 需要重新设置 view
        //    - 在访问 view 的 getter 时，如果 view=nil， 会调用 loadView -> viewDidLoad
         view = nil

        // 2. 注销通知
        //    - 重新执行 viewDidLoad 时会再次注册通知
        //    - 在这取消，可以避免重复注册
        NotificationCenter.default.removeObserver(self)
    }


    /// 登录按钮
    @objc fileprivate func userLogin()  {

        // 发送登录通知
        NotificationCenter.default.post(name: NSNotification.Name(rawValue: LCUserShouldLoginNotification), object: self)
    }

    /// 注册按钮
    @objc fileprivate func userRegister() {
        print("注册")
    }

}

// MARK: - 设置界面
extension LCBaseViewController {

    fileprivate func setupUI() {

        setupNavigationBar()

        view.backgroundColor = UIColor.white
        // 取消自动缩进 -> 默认是在高度20的地方开始的，false 后从 0 开始
        automaticallyAdjustsScrollViewInsets = false

        // 根据是否登录来显示视图
        LCNetworkManager.shared.userLogon ? setupTableView() : setupVisitorView()
    }

    /// 设置 表格视图（登录后）
    //  - 子类重写此方法， 因为子类不需要关系登录之前的事情
    func setupTableView() {

        // 1. 初始化 tableView
        tableView = UITableView(frame: view.bounds, style:.plain)
        //    -> 添加到 navigationBar 后面
        view.insertSubview(tableView!, belowSubview: navigationBar)

        // 2. 设置数据源和代理
        //    -> 让子类直接实现代理方法
        tableView?.delegate = self
        tableView?.dataSource = self

        // 3. 设置边距
        //    -> tableView 边距
        tableView?.contentInset = UIEdgeInsets(top: navigationBar.bounds.height, left: 0, bottom: tabBarController?.tabBar.bounds.height ?? 49, right: 0)
        //    -> 指示器边距
        tableView?.scrollIndicatorInsets = tableView!.contentInset

        // 4. 设置刷新控件
        //    -> 实例化
        refreshControl = UIRefreshControl()
        //    -> 添加到表格视图
        tableView?.addSubview(refreshControl!)
        //    -> 添加监听事件
        refreshControl?.addTarget(self, action: #selector(loadData), for: .valueChanged)

    }


    /// 设置 访客视图（登录前）
    private func setupVisitorView() {

        let visitorView = LCVisitorView(frame: view.bounds)
        view.insertSubview(visitorView, belowSubview: navigationBar)

        // 1. 设置访客视图信息
        visitorView.visitorInfo = visiorInfoDict

        // 2. 监听注册登录按钮点击方法
        visitorView.loginBtn.addTarget(self, action: #selector(userLogin), for: .touchUpInside)
        visitorView.registerBtn.addTarget(self, action: #selector(userRegister), for: .touchUpInside)

        // 3. 设置导航条按钮
        navItem.leftBarButtonItem = UIBarButtonItem(title: "注册", style: .plain, target: self, action: #selector(userRegister))
        navItem.rightBarButtonItem = UIBarButtonItem(title: "登录", style: .plain, target: self, action: #selector(userLogin))
    }


    /// 设置导航条
    private func setupNavigationBar() {

        // 1. 添加导航条
        view.addSubview(navigationBar)

        // 2. 设置 item 给 bar
        navigationBar.items = [navItem]

        // 3. 设置属性
        //    1> 设置 导航条 的渲染颜色 (导航条背景颜色)
        navigationBar.barTintColor = UIColor.cz_color(withHex: 0xF6F6F6)
        //    2> 设置 导航条 title 的字体颜色
        navigationBar.titleTextAttributes = [NSForegroundColorAttributeName:UIColor.darkGray]
        //    3> 设置 系统按钮的文字颜色
        navigationBar.tintColor = UIColor.orange

    }
}

// MARK: - UITableViewDelegate, UITableViewDataSource
extension LCBaseViewController: UITableViewDelegate, UITableViewDataSource {

    // 基类是指准备方法，子类负责具体的实现
    // 子类的数据源方法不需要调用 super
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 0
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        // return 只是 保证没有语法错误
        return UITableViewCell()
    }


    /// 将要显示 cell 时调用
    func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {

        // 行号
        let row = indexPath.row
        // 区号
        let section = tableView.numberOfSections - 1
        if row < 0 || section < 0 {
            return
        }
        // 行数
        let count = tableView.numberOfRows(inSection: section)


        // 1. 判断 indexPath 是否是最后一行 (行号 = 行数-1)
        if row == (count - 1) && !isPullpo {

            // 1> 修改状态值
            isPullpo = true

            // 2> 开始刷新 
            loadData()
        }
    }
}











